package org.example.myleet.p845;

public class Solution {
    /**
     * O(n)
     * 3 ms
     */
    public int longestMountain(int[] arr) {
        //用于记录山脉开始和结束的标志，以及最长山脉的记录
        int start = -1, end = -1, maxLen = 0;
        for (int i=0; i<arr.length-1; i++) {
            if (arr[i] < arr[i+1]) {
                //出现升序，此时考虑如果start在end前面，或者start还在初始状态，说明这是一段新的山脉的开始
                if (start < end || start < 0) {
                    start = i;
                }
            } else if (arr[i] > arr[i+1]) {
                //遇到下降序列，山脉的结束位置向前延伸
                end = i + 1;
            } else {
                //遇到相邻两个数相等，这时就有两种情况，要么是谷底的平坦区域，要么是山顶平坦区域
                //但是两者都不能成为山脉，于是就需要向前探索出下一个山脉的开始位置
                while (i < arr.length-1 && arr[i] >= arr[i+1]) {
                    ++i;
                }
                start = i;
            }
            //每次探索都观察山脉的长度看能不能破纪录，除去两种情况，一是初始化状态是无效的，二是start要在end的前面才算有效
            if (start > -1 && end > -1 && start < end) {
                maxLen = Math.max(maxLen, end - start + 1);
            }
        }
        return maxLen;
    }
}
